package com.proyecto.dao;

import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.proyecto.modelo.Banco;
import com.proyecto.modelo.CuentaBancaria;
import com.proyecto.modelo.Provincia;
import com.proyecto.modelo.Vehiculo;

@Repository
public class CuentaBancariaDaoImpl extends SpringHibernateDao<CuentaBancaria> implements CuentaBancariaDao{

	
	@Autowired
	public CuentaBancariaDaoImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
	
	
	/**
	 * Devuelvo la lista de cuentas cuyo dni de cliente coincide con dni ingresado
	 */
	@Override
	public List<CuentaBancaria> getListaCuentasCliente(int dni) throws HibernateException {
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		try{						
			Query query = getSession().createQuery("from Cuentas_Bancarias as cuentas" +
					"where clientes.dni = :dni");
			query.setParameter("dni", dni);

//			Query query = getSession().createQuery("select * " +
//					"from Cuentas_Bancarias as Cuenta Bancaria" +
//					"where cliente.getDNI = " + dni);
	
			List<CuentaBancaria> listaCuentas = query.list();
			session.getTransaction().commit();
			session.getSessionFactory().getCurrentSession().close();
			return listaCuentas;			
		}catch(Exception e) {
			System.out.println("Obtener Cuentas Bancarias de cliente con DNI = " + dni + " : " + e.getMessage());
			session.getSessionFactory().getCurrentSession().close();
			return null;
		}
	}

	
	/**
	 * Devuelvo la cuenta bancaria cuy cbu coincide con el cbu ingresado
	 */
	@Override
	public CuentaBancaria getCuentaBancaria(int cbu) {
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.openSession();
		session.beginTransaction();
		try{
			Query query = getSession().createQuery("select *" +
				"from Cuentas_Bancarias as cuentas" +
				"where cuentas.cbu = :cbu");
			query.setParameter("cbu", cbu);
			return (CuentaBancaria)query.uniqueResult();
		}catch (Exception e) {
			System.out.println("Obtener Cuenta Bancaria de CBU = " + cbu + " : " + e.getMessage());
			session.getSessionFactory().getCurrentSession().close();
			return null;
		}
	}

	
	/**
	 * Devuelvo el objeto que estoy manejando
	 */
	@Override
	protected Class<CuentaBancaria> getObjetoManejado() {
		return CuentaBancaria.class;
	}
	
	
	/**
	 * Elimino una cuenta bancaria de la lista de cuentas
	 */
	@Override
	public void eliminarCuentaBancaria(CuentaBancaria cuenta){
		getSession().delete(cuenta);
	}

	@Override
	public void eliminarTodasCuentas(List<CuentaBancaria> cuentas) {
		Session session = getSession();
		CuentaBancaria cuentaBancaria;
		Iterator<CuentaBancaria> iterador = cuentas.iterator();
		
		while (iterador.hasNext()) {
			cuentaBancaria = (CuentaBancaria) iterador.next();
			session.delete(cuentaBancaria);
		}
		
	}


	/**
	@Override
	public List<CuentaBancaria> getListaCuentasBanco(Banco banco) {
		// TODO Auto-generated method stub
		return null;
	}
	*/
	
	
	
	
	
}
